Codeforces Round 496 Div3

这场没打,补题记录


D

直接标记 %$3$ 的余数,对每个位置进行 $check$ 即可,注意处理 $0$


E1

题意

给两个数 $n,m$ 和 $1$~$n$ 的乱序序列,问有多少个序列的中位数为 $m$ (偶数个数的区间为区间中间左边的数)

题解

双指针从 $m$ 的位置向两边扫,$check$ 大于 $m$ 和小于 $m$ 的数的数量即可


E2

题意

给两个数 $n,m$ 和一个任意序列,问有多少个序列的中位数为 $m$ (偶数个数的区间为区间中间左边的数)

分析

因为可能存在多个m,不能像E1一样可以直接从m的位置两边直接找,直接找到区间为m的数量时间复杂度为n^2,显然不可取
Magic idea: 给一个序列,计算个序列的中位数大于等于 k 的区间个数,这个可以枚举每个位置,设前缀和为sum[],位置i的前缀和为 $sum_i$, 显然我们想统计 $sum_i-sum_j>=1(j<i)$(这个根据把>=m看做+1, < m看做-1,使得中位数为k,可以容易得到)的所有为位置,这个显然可以通过权值线段树维护区间和可以 $log$ 得到。

所有我们可以设 $f(k)$ : 区间中位数 >=m 的个数

答案则是:$f(k)-f(k+1)$

同理我们可以设 $f(k)$ : 区间中位数 <=m 的个数,那么需要统计的区间为 $sum_i-sum_j<=0(j<i)$

答案则是:$f(k)-f(k-1)$


F

题意

yige

分析